相信大家一定都有這種經驗。
把一張照片一直放大、一直放大,最後會發現圖片開始變得模糊,甚至可以看到一格一格的小方塊。
以前看到這個現象,第一個直覺就是:「喔解析度太低了。」
但仔細想想,其實還有很多問題沒有回答。
那些一格一格的小方塊到底是什麼?
我們都知道的解析度,又到底代表什麼?
還有我們常聽到的 8-bit、24-bit、Color Depth 又是在描述什麼?
這些名詞常常一起出現,搞得頭都昏了。

所以今天想說把它們整理在一起來探討。
Pixel(像素)可以想成一張圖片最小的組成單位。
如果把一張圖片放大到足夠大,就可以看到很多一格一格的小方塊,而每一個小方塊,就是一個 Pixel。
對電腦來說,每個 Pixel 都會記錄一些數值。
如果是灰階圖片,它可能只需要一個數值,例如:
120
代表這個位置的亮度。
如果是彩色圖片,就需要三個數值:
R = 255
G = 128
B = 32
代表這個 Pixel 的紅、綠、藍三個通道。
因此,一張圖片其實就是:
很多很多 Pixel 排列成一個矩陣。
知道圖片是怎麼組成之後,我們就可以自己建立一張超小的灰階圖片。
import numpy as np
import matplotlib.pyplot as plt
img = np.array([
[0, 64, 128, 192, 255],
[0, 64, 128, 192, 255],
[0, 64, 128, 192, 255],
[0, 64, 128, 192, 255],
[0, 64, 128, 192, 255]
], dtype=np.uint8)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.show()
來看一下跑出來的結果:
雖然只有 25 個 Pixel,但它已經是一張合法的圖片。
如果把它放大來看,就會很明顯看到一格一格的樣子。
當我們說:
「這張圖片是 1920 × 1080」
真正代表的是:
因此整張圖片共有:
1920 × 1080 = 2,073,600 Pixels
也就是大約 207 萬個 Pixel。
所以 Resolution 並不是在描述圖片有多大,而是在描述圖片包含多少個 Pixel。
Pixel 越多,通常可以呈現越多細節。
下面建立三張不同大小的圖片。
sizes = [32, 128, 512]
fig, axes = plt.subplots(1, 3, figsize=(9,3))
for ax, size in zip(axes, sizes):
img = np.random.randint(0, 256, (size, size), dtype=np.uint8)
ax.imshow(img, cmap="gray")
ax.set_title(f"{size}×{size}")
ax.axis("off")
plt.show()
跑出來應改長這樣:
如果只是看原始圖片,可能不容易感受到差異。
但把它們放大之後,高解析度的圖片通常會保留更多細節。
如果 Pixel 是圖片的格子,那 Color Depth 就是每個格子可以存放多少資訊。
最常見的是 8-bit。
8-bit 可以表示:
2^8 = 256
也就是:
0 ~ 255
因此灰階圖片通常都是:
如果是 RGB 彩色圖片。
每個通道都是 8-bit。
因此:
R:256 種
G:256 種
B:256 種
總共可以表示:
256 × 256 × 256 = 16,777,216 種顏色
也就是常見的 24-bit True Color。
下面的程式碼會建立一張漸層圖片。
gradient = np.linspace(0, 255, 256, dtype=np.uint8)
gradient = np.tile(gradient, (50, 1))
plt.imshow(gradient, cmap="gray")
plt.axis("off")
plt.show()

接著把它降低成只有 4-bit。
img_4bit = (gradient // 16) * 16
plt.imshow(img_4bit, cmap="gray")
plt.axis("off")
plt.show()

可以發現漸層開始變得不連續。
這就是 Color Depth 降低之後,能表示的亮度變少所造成的現象。
今天我們整理了三個很容易混在一起的名詞。
這三個概念很基礎,後面不管是影像處理、Computer Vision,甚至深度學習,都會一直遇到它們。
下一篇,我想來整理另一組也很常一起出現的名詞:
RGB、Gray 與 HSV。